const axios = require('axios');

// 企业微信API基础URL
const WECOM_API_BASE = 'https://qyapi.weixin.qq.com/cgi-bin';

/**
 * 获取企业微信访问令牌
 * @param {string} corpid - 企业ID
 * @param {string} corpsecret - 应用的凭证密钥
 * @returns {Promise<string>} 访问令牌
 */
async function getAccessToken(corpid, corpsecret) {
  try {
    const response = await axios.get(`${WECOM_API_BASE}/gettoken`, {
      params: {
        corpid,
        corpsecret
      }
    });
    
    if (response.data.errcode === 0) {
      return response.data.access_token;
    } else {
      throw new Error(`获取访问令牌失败: ${response.data.errmsg}`);
    }
  } catch (error) {
    console.error('获取访问令牌时出错:', error);
    throw error;
  }
}

/**
 * 发送企业微信消息
 * @param {Object} params - 消息参数
 * @param {string} params.touser - 接收消息的用户ID
 * @param {string} params.toparty - 接收消息的部门ID
 * @param {string} params.totag - 接收消息的标签ID
 * @param {string} params.msgtype - 消息类型
 * @param {number} params.agentid - 企业应用ID
 * @param {string} params.content - 消息内容
 * @param {number} params.safe - 是否保密消息
 * @param {Object} context - 上下文信息，包含凭证
 * @returns {Promise<Object>} 发送结果
 */
async function wecom_send_message(params, context) {
  const { touser, toparty, totag, msgtype, agentid, content, safe = 0 } = params;
  const { corpid, corpsecret } = context.credentials || {};
  
  if (!corpid || !corpsecret) {
    throw new Error('缺少企业微信凭证信息');
  }
  
  try {
    const accessToken = await getAccessToken(corpid, corpsecret);
    
    // 构建消息体
    const messageBody = {
      touser,
      toparty,
      totag,
      msgtype,
      agentid,
      safe
    };
    
    // 根据消息类型设置不同的内容格式
    switch (msgtype) {
      case 'text':
        messageBody.text = { content };
        break;
      case 'markdown':
        messageBody.markdown = { content };
        break;
      case 'textcard':
        try {
          messageBody.textcard = JSON.parse(content);
        } catch (e) {
          throw new Error('textcard内容必须是有效的JSON字符串');
        }
        break;
      case 'news':
      case 'mpnews':
        try {
          messageBody[msgtype] = JSON.parse(content);
        } catch (e) {
          throw new Error(`${msgtype}内容必须是有效的JSON字符串`);
        }
        break;
      default:
        throw new Error(`不支持的消息类型: ${msgtype}`);
    }
    
    const response = await axios.post(
      `${WECOM_API_BASE}/message/send?access_token=${accessToken}`,
      messageBody
    );
    
    if (response.data.errcode === 0) {
      return {
        success: true,
        data: response.data
      };
    } else {
      return {
        success: false,
        error: response.data.errmsg
      };
    }
  } catch (error) {
    console.error('发送消息时出错:', error);
    return {
      success: false,
      error: error.message
    };
  }
}

/**
 * 获取企业微信用户信息
 * @param {Object} params - 查询参数
 * @param {string} params.userid - 用户ID
 * @param {Object} context - 上下文信息，包含凭证
 * @returns {Promise<Object>} 用户信息
 */
async function wecom_get_user_info(params, context) {
  const { userid } = params;
  const { corpid, corpsecret } = context.credentials || {};
  
  if (!corpid || !corpsecret) {
    throw new Error('缺少企业微信凭证信息');
  }
  
  try {
    const accessToken = await getAccessToken(corpid, corpsecret);
    
    const response = await axios.get(
      `${WECOM_API_BASE}/user/get?access_token=${accessToken}&userid=${userid}`
    );
    
    if (response.data.errcode === 0) {
      return {
        success: true,
        data: response.data
      };
    } else {
      return {
        success: false,
        error: response.data.errmsg
      };
    }
  } catch (error) {
    console.error('获取用户信息时出错:', error);
    return {
      success: false,
      error: error.message
    };
  }
}

/**
 * 获取企业微信部门列表
 * @param {Object} params - 查询参数
 * @param {string} params.id - 部门ID（可选）
 * @param {Object} context - 上下文信息，包含凭证
 * @returns {Promise<Object>} 部门列表
 */
async function wecom_get_department_list(params, context) {
  const { id } = params;
  const { corpid, corpsecret } = context.credentials || {};
  
  if (!corpid || !corpsecret) {
    throw new Error('缺少企业微信凭证信息');
  }
  
  try {
    const accessToken = await getAccessToken(corpid, corpsecret);
    
    let url = `${WECOM_API_BASE}/department/list?access_token=${accessToken}`;
    if (id) {
      url += `&id=${id}`;
    }
    
    const response = await axios.get(url);
    
    if (response.data.errcode === 0) {
      return {
        success: true,
        data: response.data
      };
    } else {
      return {
        success: false,
        error: response.data.errmsg
      };
    }
  } catch (error) {
    console.error('获取部门列表时出错:', error);
    return {
      success: false,
      error: error.message
    };
  }
}

/**
 * 创建企业微信群聊
 * @param {Object} params - 创建参数
 * @param {string} params.name - 群聊名称
 * @param {Array<string>} params.userlist - 群成员ID列表
 * @param {string} params.owner - 群主ID
 * @param {string} params.chatid - 群聊ID（可选）
 * @param {Object} context - 上下文信息，包含凭证
 * @returns {Promise<Object>} 创建结果
 */
async function wecom_create_group_chat(params, context) {
  const { name, userlist, owner, chatid } = params;
  const { corpid, corpsecret } = context.credentials || {};
  
  if (!corpid || !corpsecret) {
    throw new Error('缺少企业微信凭证信息');
  }
  
  try {
    const accessToken = await getAccessToken(corpid, corpsecret);
    
    const requestBody = {
      name,
      userlist,
      owner
    };
    
    if (chatid) {
      requestBody.chatid = chatid;
    }
    
    const response = await axios.post(
      `${WECOM_API_BASE}/appchat/create?access_token=${accessToken}`,
      requestBody
    );
    
    if (response.data.errcode === 0) {
      return {
        success: true,
        data: response.data
      };
    } else {
      return {
        success: false,
        error: response.data.errmsg
      };
    }
  } catch (error) {
    console.error('创建群聊时出错:', error);
    return {
      success: false,
      error: error.message
    };
  }
}

// 导出插件功能
module.exports = {
  wecom_send_message,
  wecom_get_user_info,
  wecom_get_department_list,
  wecom_create_group_chat
}; 